import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router'

const state = () => {
  // 业务
  return {
    // 1. token
    token: getToken(),
    // 2. 用户信息
    userInfo: {}
  }
}

const mutations = {
  // 1. 设置token
  setToken(state, token) {
    state.token = token
    // 同步到本地
    setToken(token)
    // 存储时间戳到本地
    setTimeStamp()
  },
  // 2. 删除token
  removeToken(state) {
    state.token = null
    // 同步删除本地的token
    removeToken()
  },
  // 3. 设置用户信息
  setUserInfo(state, userInfo) {
    state.userInfo = userInfo
  },
  // 4. 删除用户信息
  removeUserInfo(state) {
    state.userInfo = {}
  }
}

const actions = {
  // 1. 登录操作
  async login(ctx, data) {
    // 1.1 发起网络请求
    const result = await login(data)
    console.log(result, '-----+++++')
    // 1.2 提交mutations
    ctx.commit('setToken', result)
  },
  // 2. 获取用户信息
  async getUserInfo(ctx) {
    // getUserInfo().then().catch()
    // 2.1 发起网络请求
    const result = await getUserInfo()
    const detailInfo = await getUserDetailById(result.userId)
    // 2.2 提交mutations
    ctx.commit('setUserInfo', { ...result, ...detailInfo })
    // 2.3 要返回结果 (伏笔, 主要是为了后期做权限控制)
    return result
  },
  // 3. 退出登录
  logout(ctx) {
    ctx.commit('removeToken')
    ctx.commit('removeUserInfo')
    // 还原路由表
    resetRouter()
    // 父模块 调用 子模块的action
    ctx.commit('permission/setRoutes', [], { root: true })
    // 子模块调用子模块的action 可以 将 commit的第三个参数 设置成  { root: true } 就表示当前的context不是子模块了 而是父模块
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

